Function.prototype.myBind = function (context, ...outerArgs) {
    const contextKey = Symbol('contextKey')
    // 1.将当前执行的方法添加到context上
    context[contextKey] = this || window
    // 2.返回一个新的函数
    return function (...innerArgs) {
        // MARK bind不能删除 contextKey 属性，否则下次调用返回的函数时会找不到需要被调用的函数
        // 3.执行添加到context对象上的方法，此时改方法中的this就指向context对象
        return context[contextKey](...outerArgs, ...innerArgs)
    }
}
function testBind(a, b, c) {
    console.log(this.name, a, b, c)
}
const bindObj = { name: 'bind' }
debugger
const testDist = testBind.myBind(bindObj)
testDist()

Function.prototype.myApply = function (context, args) {
    const applyFunc = Symbol('applyFunc')
    context[applyFunc] = this || window
    return context[applyFunc](...args)
}

Function.prototype.myCall = function (context, ...args) {
    const callFunc = Symbol('callFunc')
    context[callFunc] = this || window
    return context[callFunc](...args)
}
testBind.myCall({ name: 'call' }, 'a', 'b', 'c')
testBind.myApply({ name: 'apply' }, ['a', 'b', 'c'])
